// ============================== 导入依赖 ============================== //

import Vue from 'vue'

// ============================== 导出套接字方法 ============================== //

export default {
  /**
   * 套接字连接
   */
  socketConnect() {
    this.SOCKET.WS = new WebSocket(this.SOCKET.URL)

    this.socketOnOpen()
    this.socketOnClose()
    this.socketOnError()
    this.socketOnMessage()
  },

  /**
   * 套接字监听成功
   */
  socketOnOpen() {
    const { SOCKET } = this
    SOCKET.WS.onopen = (event) => {
      SOCKET.retry = 0 // 重置重试次数
      this.logInfo('【 WebSocket 】 连接', event, '连接成功') // 打印日志
    }
  },

  /**
   * 套接字监听断开
   */
  socketOnClose() {
    const { SOCKET } = this
    SOCKET.WS.onclose = (event) => {
      SOCKET.WS.onerror = () => null // 清除监听失败
      SOCKET.WS.onmessage = () => null // 清除监听消息
      SOCKET.WS = null // 清除 WebSocket
      SOCKET.retry = 0 // 重置重试次数
      this.socketConnect() // 直接重连
      this.logWarn('【 WebSocket 】 连接', event, new Error('连接断开')) // 打印日志
    }
  },

  /**
   * 套接字监听失败
   */
  socketOnError() {
    const { SOCKET } = this
    SOCKET.WS.onerror = (event) => {
      SOCKET.WS.onclose = () => null // 清除监听断开
      SOCKET.WS.onmessage = () => null // 清除监听消息
      SOCKET.WS = null // 清除 WebSocket
      SOCKET.retry++ // 递增重试次数
      this.logError('【 WebSocket 】 连接', event, new Error('连接失败')) // 打印日志

      if (!SOCKET.MAX || SOCKET.retry < SOCKET.MAX) {
        setTimeout(() => this.socketConnect(), SOCKET.GAP * 1000) // 延时重连
      }
    }
  },

  /**
   * 套接字监听消息
   */
  socketOnMessage() {
    const { SOCKET, TIME } = this
    SOCKET.WS.onmessage = (data) => {
      if (TIME.stoped) return // 全局时间已停止

      Vue.set(SOCKET, 'data', data) // 记录到全局变量
      this.logInfo('【 WebSocket 】 消息', {}, data) // 打印日志
    }
  },
}
